package service

import (
	"batbat-backend/app/dao"
	"batbat-backend/app/model"
	"context"
	"github.com/gogf/gf/database/gdb"
	"github.com/gogf/gf/errors/gerror"
	"github.com/gogf/gf/frame/g"
	"github.com/gogf/gf/os/gtime"
)

// GameNotinterest 游戏不感兴趣服务
var GameNotinterest = gameNotinterestService{}

type gameNotinterestService struct{}

// NotInterestGame 将一个游戏设为不感兴趣
func (gn *gameNotinterestService) NotInterestGame(ctx context.Context, uid uint, gid uint) error {
	return g.DB().Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
		// 查看用户是否已经不感兴趣过游戏
		count, err := dao.GameNotinterest.Ctx(ctx).TX(tx).
			Where(dao.GameNotinterest.Columns.Uid, uid).
			Where(dao.GameNotinterest.Columns.Gid, gid).
			WhereNull(dao.GameNotinterest.Columns.DeleteTime).
			Count()
		if err != nil {
			g.Log().Ctx(ctx).Errorf("查询数据库发生错误: %v", err)
			return gerror.New("设为不感兴趣失败")
		}
		if count > 0 {
			return gerror.New("已设为不感兴趣, 无需重新设置")
		}
		// 将游戏设为不感兴趣, 使用save在重复unique index的时候更新, 节约空间
		_, err = dao.GameNotinterest.Ctx(ctx).TX(tx).
			FieldsEx(dao.GameNotinterest.Columns.Id).
			Save(&model.GameNotinterest{
				Gid:        gid,
				Uid:        uid,
				CreateTime: gtime.Now(),
				DeleteTime: nil,
			})
		if err != nil {
			g.Log().Ctx(ctx).Errorf("插入数据库发生错误: %v", err)
			return gerror.New("设为不感兴趣失败")
		}
		return nil
	})
}
